Problem
向量
Description
你要维护一个向量集合,支持以下操作:
- 插入一个向量
- 删除插入的第个向量
- 查询当前集合与点积的最大值是多少,如果当前是空集输出
0
Input
第一行输入一个整数,表示操作个数
接下来行,每行先是一个整数表示类型,如果,输入向量;如果,输入表示删除第个向量;否则输入,查询与向量点积最大值是多少
保证一个向量只会被删除一次,不会删没有插入过的向量
Output
Sample Input
1 | 5 |
Sample Output
1 | 18 |
HINT
,。
标签:线段树分治
凸包
Solution
不考虑删除操作,由于点积最大的点一定在上凸壳上,可以用线段树维护凸包,支持插入一个点,三分询问一个点与凸壳上的点的最大点积。
然而有删除操作,发现每个点只在一个时间区间中存在,于是可以对时间进行线段树分治,将每个点存在区间分为个(为询问总数),这样对于一个询问,可能成为其答案的点一定存在于其到根的路径上。
对于每一个时间段结点,求出这个结点上所有点的上凸壳,并回答在这个点所代表区间内的所有询问即可。由于可以先处理两个子区间,再处理这个区间,所以顺便对询问归并排序一下也是可行的,可以避免凸包上三分。由于一个点被拆到个区间中,且每次只会加入一次栈,而询问则是进行归并排序并在每个凸壳上打擂,因此总时间复杂度为。
Code
1 |
|